{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "# 图像分类\n",
    "\n",
    "在该项目中，你将会对来自 [CIFAR-10 数据集](https://www.cs.toronto.edu/~kriz/cifar.html) 中的图像进行分类。数据集中图片的内容包括飞机（airplane）、狗（dogs）、猫（cats）及其他物体。你需要处理这些图像，接着对所有的样本训练一个卷积神经网络。\n",
    "\n",
    "具体而言，在项目中你要对图像进行正规化处理（normalization)，同时还要对图像的标签进行 one-hot 编码。接着你将会应用到你所学的技能来搭建一个具有卷积层、最大池化（Max Pooling）层、Dropout  层及全连接（fully connected）层的神经网络。最后，你会训练你的神经网络，会得到你神经网络在样本图像上的预测结果。\n",
    "\n",
    "## 下载数据\n",
    "\n",
    "运行如下代码下载 [CIFAR-10 dataset for python](https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz)。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "CIFAR-10 Dataset: 171MB [01:13, 2.32MB/s]                                                        \n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "All files found!\n"
     ]
    }
   ],
   "source": [
    "\"\"\"\n",
    "DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE\n",
    "\"\"\"\n",
    "from urllib.request import urlretrieve\n",
    "from os.path import isfile, isdir\n",
    "from tqdm import tqdm\n",
    "import problem_unittests as tests\n",
    "import tarfile\n",
    "\n",
    "cifar10_dataset_folder_path = 'cifar-10-batches-py'\n",
    "\n",
    "class DLProgress(tqdm):\n",
    "    last_block = 0\n",
    "\n",
    "    def hook(self, block_num=1, block_size=1, total_size=None):\n",
    "        self.total = total_size\n",
    "        self.update((block_num - self.last_block) * block_size)\n",
    "        self.last_block = block_num\n",
    "\n",
    "if not isfile('cifar-10-python.tar.gz'):\n",
    "    with DLProgress(unit='B', unit_scale=True, miniters=1, desc='CIFAR-10 Dataset') as pbar:\n",
    "        urlretrieve(\n",
    "            'https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz',\n",
    "            'cifar-10-python.tar.gz',\n",
    "            pbar.hook)\n",
    "\n",
    "if not isdir(cifar10_dataset_folder_path):\n",
    "    with tarfile.open('cifar-10-python.tar.gz') as tar:\n",
    "        tar.extractall()\n",
    "        tar.close()\n",
    "\n",
    "\n",
    "tests.test_folder_path(cifar10_dataset_folder_path)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 探索数据集\n",
    "\n",
    "\n",
    "为防止在运行过程中内存不足的问题，该数据集已经事先被分成了5批（batch），名为`data_batch_1`、`data_batch_2`等。每一批中都含有 *图像* 及对应的 *标签*，都是如下类别中的一种：\n",
    "\n",
    "* 飞机\n",
    "* 汽车\n",
    "* 鸟\n",
    "* 鹿\n",
    "* 狗\n",
    "* 青蛙\n",
    "* 马\n",
    "* 船\n",
    "* 卡车\n",
    "\n",
    "理解数据集也是对数据进行预测的一部分。修改如下代码中的 `batch_id` 和 `sample_id`，看看输出的图像是什么样子。其中，`batch_id` 代表着批次数（1-5），`sample_id` 代表着在该批内图像及标签的编号。\n",
    "\n",
    "你可以尝试回答如下问题：\n",
    "* 可能出现的 *标签* 都包括哪些？\n",
    "* 图像数据的取值范围是多少？\n",
    "* *标签* 的排列顺序是随机的还是有序的？\n",
    "\n",
    "对这些问题的回答，会有助于更好地处理数据，并能更好地进行预测。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Stats of batch 5:\n",
      "Samples: 10000\n",
      "Label Counts: {0: 1014, 1: 1014, 2: 952, 3: 1016, 4: 997, 5: 1025, 6: 980, 7: 977, 8: 1003, 9: 1022}\n",
      "First 20 Labels: [1, 8, 5, 1, 5, 7, 4, 3, 8, 2, 7, 2, 0, 1, 5, 9, 6, 2, 0, 8]\n",
      "\n",
      "Example of Image 9999:\n",
      "Image - Min Value: 4 Max Value: 255\n",
      "Image - Shape: (32, 32, 3)\n",
      "Label - Label Id: 1 Name: automobile\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nAaAwQQ8AhZUttfnClddSc71O+3+f+SpXjHDn3u3mmcWil9p1sL+fmjs7bW9vmE9nqV3LWfvcfCdX\nXrSY5wo39u49bJ45/Oh6alfn1YvNM5O957ldB6fNM7fXx6lds7P2Ap2IiC+dtd8f/WSpzXLSfmyH\nl86ndk33cmUnv1i0l+G8HrlrthHtjTGns7PUrqNlbm40aD+25TLRhBO5cqvnuZh4IXzRA0Bhgh4A\nChP0AFCYoAeAwgQ9ABQm6AGgMEEPAIUJegAoTNADQGGCHgAKE/QAUJigB4DCBD0AFFa2vW4yWUvN\n9Xvt7XCb21upXe+///vNM3t7z1K79pOtZpcuvdI8s702Se06f9L+G3sv76Z29V/NtRvOTo/ad60l\nW95O21u8JoPcI324kbhmw1yT4sbmudRcZzxsnlkmWsYiIlaJ9rrPkq1rz1a5tsfpuP38Hw9zFWrd\neXsN4Olpe7teRMRBslFuvd9+zQb93POy6LffV09Oc/fii+CLHgAKE/QAUJigB4DCBD0AFCboAaAw\nQQ8AhQl6AChM0ANAYYIeAAoT9ABQmKAHgMIEPQAUVrbUZmNjJzW3XLUXD0xnubKC11670jzz8kvt\nJTMREatsuUeiX6LT3n8RERHLeXspyNEyVwhyd9BekBIRMX73WvPMyZOnqV2Hi/ZrNugNUruuf/Tj\n5pmdTq6sZ5AojImI+GzeXsiynOcKUvrRfl9t7mykdl39xhupuQtb7fsuvZQr4Npcay8Jmy2OU7s+\nf3IjNXc2ay+cOotcyc8i8d7pD5MvxhfAFz0AFCboAaAwQQ8AhQl6AChM0ANAYYIeAAoT9ABQmKAH\ngMIEPQAUJugBoDBBDwCFCXoAKEzQA0BhZdvr5onmr19qn1vOF6lN01l7A9I8MRMRMZ/m5paJ+rrl\nfJraNZu1zz17/jy16+H9h7m5J/vNM5/cupPadXrS3v41HOVa+SYbm80zX3733dSuiy9dTM2dLtrv\nj9OT09Suo+OT5pkLF3PH9bt/L3ceX9rebp7pLHJtfhHt77jOLPdevDjKncfDRfuzeXR2mNq1P33W\nPHMw3UvtehF80QNAYYIeAAoT9ABQmKAHgMIEPQAUJugBoDBBDwCFCXoAKEzQA0Bhgh4AChP0AFCY\noAeAwsqW2pydJcssjtpLDlaRK4rodDq/kZmIiOUqVzDRifZ93cEgtSvzr3M0Gad2jdcnqbnuk/Yy\n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\nZ5cuXkjt+ta3/mXzzOef3Unt+v0/eD8XML/CFz0AFCboAaAwQQ8AhQl6AChM0ANAYYIeAAoT9ABQ\nmKAHgMIEPQAUJugBoDBBDwCFCXoAKEzQA0Bhddvr/u2/Th3YYjF/0T/lb7U2GTXP3L57L7VrsMod\nV3fQ/hsTRVcREfHGG1eaZ/q9XNPVZC3XrDUctp+P0ThxDiOil2jjilXu5A/Hk+aZfubeiIj7Dx6l\n5n768180z9y5n3te4ui4eWSaPPdHs1lqrj9ob/MbTdqvc0TEKHF/dDP3b0QsFrnGwbVx+zO9NVxL\n7frn3/xnzTPvv//11K719Q3tdQDA307QA0Bhgh4AChP0AFCYoAeAwgQ9ABQm6AGgMEEPAIUJegAo\nTNADQGGCHgAKE/QAUFh7K8L/J6anp6m5bAFJxnw6bZ7ZXM+VMKzmyVKbfnsxxUc/upHatZE4to2N\nXEnHdJabmySKMxazXIHOKLFrkigfiYiYT9ufl7OT9vs3ImJ3Yz0194dff7d5pt/PFYnsPX/ePPPw\n0dPUrps3P0vN3fjk0+aZo4PD1K7JpP2aZQt0hon7PiKi22l/Vx2fnKR2HZ+2z62vb6R2vQi+6AGg\nMEEPAIUJegAoTNADQGGCHgAKE/QAUJigB4DCBD0AFCboAaAwQQ8AhQl6AChM0ANAYYIeAAor2163\ns51rChoM2k/JMtkM9yzRkPXo/qPUrrVJrhFqbb29ze/unTupXdvb7e11l197JbVrPM61G24lmtfO\nRsepXeNE+9dsPdco1++3X+fRKNdCN1/MUnOzWftztjbupHad39lqnrl04Xxq11e+fDU19w9P/rB5\n5v69+6ldnyYa9o6Oc81wo1Gu9W40ar+Hz5/fTe366lffSs39tviiB4DCBD0AFCboAaAwQQ8AhQl6\nAChM0ANAYYIeAAoT9ABQmKAHgMIEPQAUJugBoDBBDwCFCXoAKKxue93OZmpusVg2z8xzhWGxm/mN\ni0Vq18HhYWru+fOj5pkne89Su2591t56t7vd3jIWEXF6kmuvOzk+a57Z3Mw1B67P2lveTk9zx7W2\n1t5E1+/lvhOWy/ZnLCKi123fNxykVsVy0d6UN0tcr4iI/qC9dS0iYjvRpLiTbMq7du3t5pn5LPeu\n2t/fT811B73mmXeuXUvt+sLl15pnMvdURES3938f077oAaAwQQ8AhQl6AChM0ANAYYIeAAoT9ABQ\nmKAHgMIEPQAUJugBoDBBDwCFCXoAKEzQA0BhZUttYtVJjZ1NM0UiuTKLWLWXe6wniiwiIvrDYWru\n4xufNs/MEsVAERGf37nfPLORPB9ffP1yam65ai+mODk9Se3aOGlvS9rZ3kjtmibu++xxDfq5pple\nYm4+zxWJjMbtRUTjyVpqV2eVK3+ZnrYfW7fbXvwSETGft//G1Sq1Kl66dCE1d/Hi+eaZYT93Ph4/\nfNA8s76ZK1rb2tpNzf0qX/QAUJigB4DCBD0AFCboAaAwQQ8AhQl6AChM0ANAYYIeAAoT9ABQmKAH\ngMIEPQAUJugBoDBBDwCFlW2vOzjKNWudzdobw2aJ5q+IiNUy0fKWaE+LiOgnW5pefuli88z73/ha\nalemQa3XyVVkPdvfT82tb7Q3UI1HuSbFw8PD5pnpLHcv7u60N2QtI3dcJ3GWmuv32u/hZaJ1LSJi\nOD5tnzk+Tu0ajdqb8iIiJmvtzY29bvLbLvPe6eR2HSTu+4iIx0+eNM8Mk+f+4sX2hr21tUlq17V3\ntNcBAH8HQQ8AhQl6AChM0ANAYYIeAAoT9ABQmKAHgMIEPQAUJugBoDBBDwCFCXoAKEzQA0BhZUtt\n9g9yxQjzRXt5QzdZ7hHRXsjSScxERHSWubn1tbXmmatffD216+i4vYjo4PAgtWuZuM4REXfv3m+e\nmUyGqV2vvvJy88xsliuMefCw/bjW19oLfiIi1tbb76lfai+Nmc1y13l40n7NBsPcdR4MB6m5/sHz\n5pnhIPcbMwU640nuOnc6uQKuwaA9zpaLXAnUz278vHlmtcq9g6+9kysJ+1W+6AGgMEEPAIUJegAo\nTNADQGGCHgAKE/QAUJigB4DCBD0AFCboAaAwQQ8AhQl6AChM0ANAYYIeAArrZBt1AID/9/miB4DC\nBD0AFCboAaAwQQ8AhQl6AChM0ANAYYIeAAoT9ABQmKAHgMIEPQAUJugBoDBBDwCFCXoAKEzQA0Bh\ngh4AChP0AFCYoAeAwgQ9ABQm6AGgMEEPAIUJegAoTNADQGGCHgAKE/QAUJigB4DCBD0AFCboAaAw\nQQ8AhQl6AChM0ANAYYIeAAoT9ABQmKAHgMIEPQAUJugBoDBBDwCFCXoAKEzQA0Bhgh4AChP0AFCY\noAeAwgQ9ABQm6AGgMEEPAIUJegAoTNADQGH/B9XXAF5GKwfsAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1f8fae7b0b8>"
      ]
     },
     "metadata": {
      "image/png": {
       "height": 250,
       "width": 253
      }
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "%config InlineBackend.figure_format = 'retina'\n",
    "\n",
    "import helper\n",
    "import numpy as np\n",
    "\n",
    "# Explore the dataset\n",
    "batch_id = 5\n",
    "sample_id = 9999\n",
    "helper.display_stats(cifar10_dataset_folder_path, batch_id, sample_id)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 图像预处理功能的实现\n",
    "### 正规化\n",
    "\n",
    "在如下的代码中，修改 `normalize` 函数，使之能够对输入的图像数据 `x` 进行处理，输出一个经过正规化的、Numpy array 格式的图像数据。\n",
    "\n",
    "**注意：**\n",
    "处理后的值应当在 $[0,1]$ 的范围之内。返回值应当和输入值具有相同的形状。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Tests Passed\n"
     ]
    }
   ],
   "source": [
    "\n",
    "def normalize(x):\n",
    "    \"\"\"\n",
    "    Normalize a list of sample image data in the range of 0 to 1\n",
    "    : x: List of image data.  The image shape is (32, 32, 3)\n",
    "    : return: Numpy array of normalize data\n",
    "    \"\"\"\n",
    "    # TODO: Implement Function\n",
    "    return (x - np.min(x))/(np.max(x) - np.min(x))\n",
    "\n",
    "\n",
    "\"\"\"\n",
    "DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE\n",
    "\"\"\"\n",
    "tests.test_normalize(normalize)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### One-hot 编码\n",
    "\n",
    "在如下代码中，你将继续实现预处理的功能，实现一个 `one_hot_encode` 函数。函数的输入 `x` 是 *标签* 构成的列表，返回值是经过 One_hot 处理过后的这列 *标签* 对应的 One_hot 编码，以 Numpy array 储存。其中，*标签* 的取值范围从0到9。每次调用该函数时，对相同的标签值，它输出的编码也是相同的。请确保在函数外保存编码的映射（map of encodings）。\n",
    "\n",
    "**提示：**\n",
    "\n",
    "你可以尝试使用 sklearn preprocessing 模块中的 `LabelBinarizer` 函数。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Tests Passed\n"
     ]
    }
   ],
   "source": [
    "from sklearn.preprocessing import LabelBinarizer\n",
    "# 预先训练好encoder，确保一定会编码为十类\n",
    "lb = LabelBinarizer()\n",
    "lb.fit([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])\n",
    "\n",
    "def one_hot_encode(x):\n",
    "    \"\"\"\n",
    "    One hot encode a list of sample labels. Return a one-hot encoded vector for each label.\n",
    "    : x: List of sample Labels\n",
    "    : return: Numpy array of one-hot encoded labels\n",
    "    \"\"\"\n",
    "    # TODO: Implement Function\n",
    "    return lb.transform(x)\n",
    "\n",
    "\n",
    "\"\"\"\n",
    "DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE\n",
    "\"\"\"\n",
    "tests.test_one_hot_encode(one_hot_encode)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 随机打乱数据\n",
    "\n",
    "正如你在上方探索数据部分所看到的，样本的顺序已经被随机打乱了。尽管再随机处理一次也没问题，不过对于该数据我们没必要再进行一次相关操作了。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 对所有图像数据进行预处理并保存结果\n",
    "\n",
    "运行如下代码，它将会预处理所有的 CIFAR-10 数据并将它另存为文件。此外，如下的代码还将会把 10% 的训练数据留出作为验证数据。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "\"\"\"\n",
    "DON'T MODIFY ANYTHING IN THIS CELL\n",
    "\"\"\"\n",
    "# Preprocess Training, Validation, and Testing Data\n",
    "helper.preprocess_and_save_data(cifar10_dataset_folder_path, normalize, one_hot_encode)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 检查点\n",
    "\n",
    "这是你的首个检查点。因为预处理完的数据已经被保存到硬盘上了，所以如果你需要回顾或重启该 notebook，你可以在这里重新开始。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "features Dimension:  (5000, 32, 32, 3)\n",
      "labels Dimension (5000, 10)\n",
      "Example: label for #0 image is [0 0 0 0 1 0 0 0 0 0]\n"
     ]
    }
   ],
   "source": [
    "\"\"\"\n",
    "DON'T MODIFY ANYTHING IN THIS CELL\n",
    "\"\"\"\n",
    "import pickle\n",
    "import problem_unittests as tests\n",
    "import helper\n",
    "\n",
    "# Load the Preprocessed Validation data\n",
    "valid_features, valid_labels = pickle.load(open('preprocess_validation.p', mode='rb'))\n",
    "\n",
    "print(\"features Dimension: \", valid_features.shape)\n",
    "print(\"labels Dimension\", valid_labels.shape)\n",
    "print(\"Example: label for #0 image is\", valid_labels[0,:])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 搭建神经网络\n",
    "\n",
    "为搭建神经网络，你需要将搭建每一层的过程封装到一个函数中。大部分的代码你在函数外已经见过。为能够更透彻地测试你的代码，我们要求你把每一层都封装到一个函数中。这能够帮助我们给予你更好的回复，同时还能让我们使用 unittests 在你提交报告前检测出你项目中的小问题。\n",
    "\n",
    ">**注意：** 如果你时间紧迫，那么在该部分我们为你提供了一个便捷方法。在接下来的一些问题中，你可以使用来自 [TensorFlow Layers](https://www.tensorflow.org/api_docs/python/tf/layers) 或 [TensorFlow Layers (contrib)](https://www.tensorflow.org/api_guides/python/contrib.layers) 包中的函数来搭建各层，不过不可以用他们搭建卷积-最大池化层。TF Layers 和 Keras 及 TFLean 中对层的抽象比较相似，所以你应该很容易上手。\n",
    "\n",
    "> 不过，如果你希望能够更多地实践，我们希望你能够在**不**使用 TF Layers 的情况下解决所有问题。你依然**能**使用来自其他包但和 layers 中重名的函数。例如，你可以使用 TF Neural Network 版本的 `conv_2d`[tf.nn.conv2d](https://www.tensorflow.org/api_docs/python/tf/nn/conv2d). \n",
    "\n",
    "让我们开始吧！\n",
    "\n",
    "### 输入\n",
    "\n",
    "神经网络需要能够读取图像数据、经 one-hot 编码之后的标签及 dropout 中的保留概率。修改如下函数：\n",
    "\n",
    "* 修改 `neural_net_image_input` 函数：\n",
    " * 返回 [TF Placeholder](https://www.tensorflow.org/api_docs/python/tf/placeholder)。\n",
    " * 使用 `image_shape` 设定形状，设定批大小（batch size)为 `None`。\n",
    " * 使用 [TF Placeholder](https://www.tensorflow.org/api_docs/python/tf/placeholder) 中的 `Name` 参数，命名该 TensorFlow placeholder 为 \"x\"。\n",
    "\n",
    "\n",
    "* 修改 `neural_net_label_input` 函数： \n",
    " * 返回 [TF Placeholder](https://www.tensorflow.org/api_docs/python/tf/placeholder)。\n",
    " * 使用 `n_classes` 设定形状，设定批大小（batch size)为 `None`。\n",
    " * 使用 [TF Placeholder](https://www.tensorflow.org/api_docs/python/tf/placeholder) 中的 `Name` 参数，命名该 TensorFlow placeholder 为 \"y\"。\n",
    "\n",
    "\n",
    "* 修改 `neural_net_keep_prob_input` 函数：\n",
    " * 返回 [TF Placeholder](https://www.tensorflow.org/api_docs/python/tf/placeholder) 作为 dropout 的保留概率（keep probability）。\n",
    " * 使用 [TF Placeholder](https://www.tensorflow.org/api_docs/python/tf/placeholder) 中的 `Name` 参数，命名该 TensorFlow placeholder 为 \"keep_prob\"。\n",
    " \n",
    "我们会在项目最后使用这些名字，来载入你储存的模型。\n",
    "\n",
    "**注意：**在 TensorFlow 中，对形状设定为 `None`，能帮助设定一个动态的大小。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Image Input Tests Passed.\n",
      "Label Input Tests Passed.\n",
      "Keep Prob Tests Passed.\n"
     ]
    }
   ],
   "source": [
    "import tensorflow as tf\n",
    "\n",
    "# 整个网络的输入尺寸：\n",
    "# 第一维：batch的大小（就是样本数量，比如128张样本图）\n",
    "# 第二维：长\n",
    "# 第三维：宽\n",
    "# 第四维：颜色通道数（一般都是RGB图片，因此是三个通道）\n",
    "def neural_net_image_input(image_shape):\n",
    "    \"\"\"\n",
    "    Return a Tensor for a batch of image input\n",
    "    : image_shape: Shape of the images\n",
    "    : return: Tensor for image input.\n",
    "    \"\"\"\n",
    "    # TODO: Implement Function\n",
    "    return tf.placeholder(tf.float32, shape=[None, image_shape[0], image_shape[1], image_shape[2]], name='x')\n",
    "    # 用加号性质合并，语法更简洁\n",
    "    return tf.placeholder(tf.float32, shape=[[None,] + image_shape], name='x')\n",
    "    # TensorFlow的shape参数既允许list也允许tuple类型\n",
    "    return tf.placeholder(tf.float32, shape=((None,) + image_shape), name='x')   \n",
    "\n",
    "# 整个网络的输出结果\n",
    "# 第一维：样本（对应于输入的每一张样本图）\n",
    "# 第二维：分类号（由于采用onehot编码，因此有多少种分类这个维度就有多长）\n",
    "def neural_net_label_input(n_classes):\n",
    "    \"\"\"\n",
    "    Return a Tensor for a batch of label input\n",
    "    : n_classes: Number of classes\n",
    "    : return: Tensor for label input.\n",
    "    \"\"\"\n",
    "    # TODO: Implement Function\n",
    "    return tf.placeholder(tf.float32, shape=[None, n_classes], name='y')\n",
    "\n",
    "# Drop-out专用\n",
    "def neural_net_keep_prob_input():\n",
    "    \"\"\"\n",
    "    Return a Tensor for keep probability\n",
    "    : return: Tensor for keep probability.\n",
    "    \"\"\"\n",
    "    # TODO: Implement Function\n",
    "    return tf.placeholder(tf.float32, name='keep_prob')\n",
    "\n",
    "\n",
    "\"\"\"\n",
    "DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE\n",
    "\"\"\"\n",
    "tf.reset_default_graph()\n",
    "tests.test_nn_image_inputs(neural_net_image_input)\n",
    "tests.test_nn_label_inputs(neural_net_label_input)\n",
    "tests.test_nn_keep_prob_inputs(neural_net_keep_prob_input)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 卷积-最大池（Convolution and Max Pooling）化层\n",
    "\n",
    "卷积层在图像处理中取得了不小的成功。在这部分的代码中，你需要修改 `conv2d_maxpool` 函数来先后实现卷积及最大池化的功能。\n",
    "\n",
    "* 使用 `conv_ksize`、`conv_num_outputs` 及 `x_tensor` 来创建权重（weight）及偏差（bias）变量。\n",
    "* 对 `x_tensor` 进行卷积，使用 `conv_strides` 及*权重*。\n",
    " * 我们建议使用 SAME padding，不过你也可尝试其他 padding 模式。 \n",
    "\n",
    "\n",
    "* 加上*偏差*。\n",
    "* 对卷积结果加上一个非线性函数作为激活层。\n",
    "* 基于 `pool_ksize` 及 `pool_strides` 进行最大池化。\n",
    " * 我们建议使用 SAME padding，不过你也可尝试其他 padding 模式。\n",
    "\n",
    "\n",
    "**注意：**\n",
    "你**不**可以使用来自 [TensorFlow Layers](https://www.tensorflow.org/api_docs/python/tf/layers) 或 [TensorFlow Layers (contrib)](https://www.tensorflow.org/api_guides/python/contrib.layers) 包中的函数来实现**这一层**的功能。但是你可以使用 TensorFlow 的[Neural Network](https://www.tensorflow.org/api_docs/python/tf/nn)包。\n",
    "\n",
    "对于如上的快捷方法，你在**其他层**中可以尝试使用。\n",
    "\n",
    "\n",
    "**提示：**\n",
    "当你在 Python 中希望展开（unpacking）某个变量的值作为函数的参数，你可以参考 [unpacking](https://docs.python.org/3/tutorial/controlflow.html#unpacking-argument-lists) 运算符。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 权重初始值的方差会影响准确率\n",
    "global_stddev = 0.01"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Tests Passed\n"
     ]
    }
   ],
   "source": [
    "def conv2d_maxpool(x_tensor, conv_num_outputs, conv_ksize, conv_strides, pool_ksize, pool_strides):\n",
    "    \"\"\"\n",
    "    Apply convolution then max pooling to x_tensor\n",
    "    :param x_tensor: TensorFlow Tensor\n",
    "    :param conv_num_outputs: Number of outputs for the convolutional layer\n",
    "    :param conv_ksize: kernal size 2-D Tuple for the convolutional layer\n",
    "    :param conv_strides: Stride 2-D Tuple for convolution\n",
    "    :param pool_ksize: kernal size 2-D Tuple for pool\n",
    "    :param pool_strides: Stride 2-D Tuple for pool\n",
    "    : return: A tensor that represents convolution and max pooling of x_tensor\n",
    "    \"\"\"\n",
    "    # 初始化卷积层的weight和bias矩阵\n",
    "    # x_tensor shape = [batch, height, width, depth]\n",
    "    # weight = height * width * depth * output ~ init at normal distribution N(0, 0.01)\n",
    "    # bias = output ~ init at 0\n",
    "    depth = x_tensor.shape[3].value\n",
    "    weight_shape = [conv_ksize[0], conv_ksize[1], depth, conv_num_outputs]\n",
    "    weight_init_val = tf.truncated_normal(weight_shape, mean=0, stddev=global_stddev)\n",
    "    # Define variables\n",
    "    weight = tf.Variable(weight_init_val)\n",
    "    bias = tf.Variable(tf.zeros(conv_num_outputs))\n",
    "    \n",
    "    # 执行二维卷积（根据给定输入以及滤波器尺寸、扫描方式）\n",
    "    # stride = [batch, height, width, depth]\n",
    "    # Apply stride only to height and width: [1, x, x, 1]\n",
    "    stride = [1, conv_strides[0], conv_strides[1], 1]\n",
    "    y = tf.nn.conv2d(input=x_tensor, filter=weight, strides=stride, padding='SAME')\n",
    "    y = tf.nn.bias_add(y, bias)\n",
    "    \n",
    "    # 送入非线性激活函数产生概率值\n",
    "    y = tf.nn.relu(y)\n",
    "    \n",
    "    # 用最大池化处理数据（根据给定的池化滤波器尺寸和扫描方式）\n",
    "    filter_shape = [1, pool_ksize[0], pool_ksize[1], 1]\n",
    "    stride = [1, pool_strides[0], pool_strides[1], 1]\n",
    "    y = tf.nn.max_pool(y, ksize=filter_shape, strides=stride, padding='SAME')\n",
    "    \n",
    "    # 返回最后的输出结果\n",
    "    return y\n",
    "\n",
    "\n",
    "\"\"\"\n",
    "DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE\n",
    "\"\"\"\n",
    "tests.test_con_pool(conv2d_maxpool)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 展开层\n",
    "\n",
    "修改 `flatten` 函数，来将4维的输入张量 `x_tensor` 转换为一个二维的张量。输出的形状应当是 `(Batch Size, Flattened Image Size)`。\n",
    "快捷方法：你可以使用来自 [TensorFlow Layers](https://www.tensorflow.org/api_docs/python/tf/layers) 或 [TensorFlow Layers (contrib)](https://www.tensorflow.org/api_guides/python/contrib.layers) 包中的函数来实现该功能。不过你也可以只使用 TensorFlow 包中的函数来挑战自己。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Tests Passed\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "def flatten(x_tensor):\n",
    "    \"\"\"\n",
    "    Flatten x_tensor to (Batch Size, Flattened Image Size)\n",
    "    : x_tensor: A tensor of size (Batch Size, ...), where ... are the image dimensions.\n",
    "    : return: A tensor of size (Batch Size, Flattened Image Size).\n",
    "    \"\"\"\n",
    "    # TODO: Implement Function\n",
    "    # 获得输入矩阵在所有维度上的长度值的list\n",
    "    # 例如x如果有128张图，长乘宽是32x32，有RGB三个颜色通道，那么x_shape = [128, 32, 32, 3]\n",
    "    x_shape = x_tensor.shape.as_list()\n",
    "\n",
    "    # 把后三个维度压缩为一个维度，用一个向量表示一张图的所有像素信息\n",
    "    img_len = np.prod(x_shape[1:])\n",
    "    \n",
    "    # OPT1：用-1自由推断维度长度\n",
    "    return tf.reshape(x_tensor, shape=[-1, img_len])\n",
    "\n",
    "    # OPT2：用原有shape对象，不可以直接用x_shape[0]，因为类型不同\n",
    "    return tf.reshape(x_tensor, shape=[tf.shape(x_tensor)[0], img_len])\n",
    "\n",
    "    # OPT3：直接调用API将x_tensor变形为[batch, k]\n",
    "    return tf.contrib.layers.flatten(x_tensor)\n",
    "\n",
    "\n",
    "\"\"\"\n",
    "DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE\n",
    "\"\"\"\n",
    "tests.test_flatten(flatten)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 全连接层\n",
    "\n",
    "修改 `fully_conn` 函数，来对形如 `(batch Size, num_outputs)` 的输入 `x_tensor` 应用一个全连接层。快捷方法：你可以使用来自 [TensorFlow Layers](https://www.tensorflow.org/api_docs/python/tf/layers) 或 [TensorFlow Layers (contrib)](https://www.tensorflow.org/api_guides/python/contrib.layers) 包中的函数来实现该功能。不过你也可以只使用 TensorFlow 包中的函数来挑战自己。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Tests Passed\n"
     ]
    }
   ],
   "source": [
    "def fully_conn(x_tensor, num_outputs):\n",
    "    \"\"\"\n",
    "    Apply a fully connected layer to x_tensor using weight and bias\n",
    "    : x_tensor: A 2-D tensor where the first dimension is batch size.\n",
    "    : num_outputs: The number of output that the new tensor should be.\n",
    "    : return: A 2-D tensor where the second dimension is num_outputs.\n",
    "    \"\"\"\n",
    "    # OPT1：实现全链接的隐藏层。其实就是标准的矩阵乘法形式。\n",
    "    # 因为已知 input = batch * K，output = batch * num_outputs, 因此可以推测出 weight = K * num_outputs\n",
    "    weight = tf.Variable(tf.truncated_normal([x_tensor.shape[1].value, num_outputs], mean=0, stddev=global_stddev))\n",
    "    bias = tf.Variable(tf.zeros(num_outputs))\n",
    "    y = tf.matmul(x_tensor, weight)        # b,k * k,n = b,n\n",
    "    y = tf.add(y, bias)\n",
    "    y = tf.nn.relu(y)\n",
    "    return y\n",
    "    \n",
    "    # OPT2：直接调用API将x_tensor经过全链接层输出为num_outputs个输出，默认使用ReLU作为激励函数\n",
    "    return tf.contrib.layers.fully_connected(x_tensor, num_outputs, activation_fn=tf.nn.relu)\n",
    "\n",
    "\n",
    "\"\"\"\n",
    "DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE\n",
    "\"\"\"\n",
    "tests.test_fully_conn(fully_conn)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 输出层\n",
    "\n",
    "修改 `output` 函数，来对形如 `(batch Size, num_outputs)` 的输入 `x_tensor` 应用一个全连接层。快捷方法：你可以使用来自 [TensorFlow Layers](https://www.tensorflow.org/api_docs/python/tf/layers) 或 [TensorFlow Layers (contrib)](https://www.tensorflow.org/api_guides/python/contrib.layers) 包中的函数来实现该功能。不过你也可以只使用 TensorFlow 包中的函数来挑战自己。\n",
    "\n",
    "**注意：**\n",
    "激活函数、softmax 或者交叉熵（corss entropy）**不**应被加入到该层。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Tests Passed\n"
     ]
    }
   ],
   "source": [
    "def output(x_tensor, num_outputs):\n",
    "    \"\"\"\n",
    "    Apply a output layer to x_tensor using weight and bias\n",
    "    : x_tensor: A 2-D tensor where the first dimension is batch size.\n",
    "    : num_outputs: The number of output that the new tensor should be.\n",
    "    : return: A 2-D tensor where the second dimension is num_outputs.\n",
    "    \"\"\"\n",
    "    # OPT1：实现全链接的隐藏层。其实就是标准的矩阵乘法形式。\n",
    "    weight = tf.Variable(tf.truncated_normal([x_tensor.shape[1].value, num_outputs], mean=0, stddev=global_stddev))\n",
    "    bias = tf.Variable(tf.zeros(num_outputs))\n",
    "    y = tf.matmul(x_tensor, weight)\n",
    "    y = tf.add(y, bias)\n",
    "    return y\n",
    "    \n",
    "    # OPT2：直接调用API将x_tensor通过全链接层输出，不经过任何激励函数。\n",
    "    return tf.contrib.layers.fully_connected(x_tensor, num_outputs, activation_fn=None)\n",
    "\n",
    "\n",
    "\"\"\"\n",
    "DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE\n",
    "\"\"\"\n",
    "tests.test_output(output)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 创建卷积模型\n",
    "\n",
    "修改 `conv_net` 函数，使之能够生成一个卷积神经网络模型。该函数的输入为一批图像数据 `x`，输出为 logits。在函数中，使用上方你修改的创建各种层的函数来创建该模型：\n",
    "\n",
    "* 使用 1 到 3 个卷积-最大池化层\n",
    "* 使用一个展开层\n",
    "* 使用 1 到 3 个全连接层\n",
    "* 使用一个输出层\n",
    "* 返回输出结果\n",
    "* 在一个或多个层上使用 [TensorFlow's Dropout](https://www.tensorflow.org/api_docs/python/tf/nn/dropout)，对应的保留概率为 `keep_prob`. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 138,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Neural Network Built!\n"
     ]
    }
   ],
   "source": [
    "def conv_net(x, keep_prob):\n",
    "    \"\"\"\n",
    "    Create a convolutional neural network model\n",
    "    : x: Placeholder tensor that holds image data.\n",
    "    : keep_prob: Placeholder tensor that hold dropout keep probability.\n",
    "    : return: Tensor that represents logits\n",
    "    \"\"\"\n",
    "    # 卷积池化层\n",
    "    # 可调参数列表\n",
    "    # 0. 层数：不断调用并串联conv2d_maxpool，且每一层可以调整下面五个参数：\n",
    "    # 1. 输出特征个数：conv_num_outputs\n",
    "    # 2. 卷积滤波器二维尺寸：conv_ksize\n",
    "    # 3. 卷积滤波器二维步长：conv_strides\n",
    "    # 4. 池化滤波器二维尺寸：pool_ksize\n",
    "    # 5. 池化滤波器二维步长：pool_strides\n",
    "    # 函数签名：conv2d_maxpool(x, conv_num_outputs, conv_ksize, conv_strides, pool_ksize, pool_strides)\n",
    "    x_after_pool = x\n",
    "    x_after_pool = conv2d_maxpool(x_after_pool, 16, [3, 3], [1, 1], [2, 2], [1, 1])\n",
    "    x_after_pool = conv2d_maxpool(x_after_pool, 16, [3, 3], [1, 1], [2, 2], [1, 1])\n",
    "    x_after_pool = conv2d_maxpool(x_after_pool, 16, [3, 3], [1, 1], [2, 2], [1, 1])\n",
    "    \n",
    "    # 展开层\n",
    "    x_after_flatten = flatten(x_after_pool)\n",
    "\n",
    "    # 全链接层\n",
    "    # 可调参数列表\n",
    "    # 层数：串联fully_conn\n",
    "    # 输出特征个数：num_outputs\n",
    "    # 函数签名：fully_conn(x_tensor, num_outputs)\n",
    "    x_after_full_conn = fully_conn(x_after_flatten, 1024)\n",
    "\n",
    "    \n",
    "    # Dropout：在全链接层和输出层之间进行\n",
    "    x_after_dropout = tf.nn.dropout(x_after_full_conn, keep_prob)\n",
    "    \n",
    "    # 输出层\n",
    "    # 输出特征个数为10，对应于实际要分类的10个one-hot特征\n",
    "    y = output(x_after_dropout, 10)\n",
    "    \n",
    "    return y\n",
    "\n",
    "\n",
    "\"\"\"\n",
    "DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE\n",
    "\"\"\"\n",
    "\n",
    "##############################\n",
    "## Build the Neural Network ##\n",
    "##############################\n",
    "\n",
    "# Remove previous weights, bias, inputs, etc..\n",
    "tf.reset_default_graph()\n",
    "\n",
    "# Inputs\n",
    "x = neural_net_image_input((32, 32, 3))\n",
    "y = neural_net_label_input(10)\n",
    "keep_prob = neural_net_keep_prob_input()\n",
    "\n",
    "# Model\n",
    "logits = conv_net(x, keep_prob)\n",
    "\n",
    "# 给输出结果起个名字方便后续调用\n",
    "# Name logits Tensor, so that is can be loaded from disk after training\n",
    "logits = tf.identity(logits, name='logits')\n",
    "\n",
    "# 代价函数：使用交叉熵作为代价函数\n",
    "# 对代价函数进行最优化：AdamOptimizer，一种SGD方法\n",
    "# Loss and Optimizer\n",
    "cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y))\n",
    "optimizer = tf.train.AdamOptimizer().minimize(cost)\n",
    "\n",
    "# 定义评估指标: 准确率\n",
    "# 扫描每个图像，比较估计值和真实值label沿第二维的最大值索引\n",
    "correct_pred = tf.equal(tf.argmax(logits, 1), tf.argmax(y, 1))    \n",
    "# 求平均\n",
    "accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32), name='accuracy')\n",
    "\n",
    "tests.test_conv_net(conv_net)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 训练该神经网络\n",
    "\n",
    "### 最优化\n",
    "\n",
    "修改 `train_neural_network` 函数以执行单次最优化。该最优化过程应在一个 `session` 中使用 `optimizer` 来进行该过程，它的 `feed_dict` 包括：\n",
    "* `x` 代表输入图像\n",
    "* `y` 代表*标签*\n",
    "* `keep_prob` 为 Dropout 过程中的保留概率\n",
    "\n",
    "对每批数据该函数都会被调用，因而 `tf.global_variables_initializer()` 已经被调用过。\n",
    "\n",
    "注意：该函数并不要返回某个值，它只对神经网络进行最优化。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Tests Passed\n"
     ]
    }
   ],
   "source": [
    "def train_neural_network(session, optimizer, keep_probability, feature_batch, label_batch):\n",
    "    \"\"\"\n",
    "    Optimize the session on a batch of images and labels\n",
    "    : session: Current TensorFlow session\n",
    "    : optimizer: TensorFlow optimizer function\n",
    "    : keep_probability: keep probability\n",
    "    : feature_batch: Batch of Numpy image data\n",
    "    : label_batch: Batch of Numpy label data\n",
    "    \"\"\"\n",
    "    # TODO: Implement Function\n",
    "    session.run(optimizer, feed_dict={x:feature_batch, y:label_batch, keep_prob:keep_probability})\n",
    "\n",
    "\n",
    "\"\"\"\n",
    "DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE\n",
    "\"\"\"\n",
    "tests.test_train_nn(train_neural_network)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 显示状态\n",
    "\n",
    "修改 `print_stats` 函数来打印 loss 值及验证准确率。 使用全局的变量 `valid_features` 及 `valid_labels` 来计算验证准确率。 设定保留概率为 1.0 来计算 loss 值及验证准确率。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def print_stats(session, feature_batch, label_batch, cost, accuracy):\n",
    "    \"\"\"\n",
    "    Print information about loss and validation accuracy\n",
    "    : session: Current TensorFlow session\n",
    "    : feature_batch: Batch of Numpy image data\n",
    "    : label_batch: Batch of Numpy label data\n",
    "    : cost: TensorFlow cost function\n",
    "    : accuracy: TensorFlow accuracy function\n",
    "    \"\"\"\n",
    "    # 此时已经对模型训练完一批数据\n",
    "    # 查看模型对当前训练集的预测值与真实值之间的差距（交叉熵）\n",
    "    loss = session.run(cost, feed_dict={x:feature_batch, y:label_batch, keep_prob:1})\n",
    "    \n",
    "    # 查看模型对当前训练集的预测准确度\n",
    "    acc = session.run(accuracy, feed_dict={x:valid_features, y:valid_labels, keep_prob:1})\n",
    "    \n",
    "    # 实时显示\n",
    "    print(\"loss =\", loss, \"   accuracy =\", round(acc*100, 2), \"%\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 超参数调节\n",
    "\n",
    "你需要调节如下的参数：\n",
    "* 设定 `epoches` 为模型停止学习或开始过拟合时模型的迭代次数。\n",
    "* 设定 `batch_size` 为你内存能支持的最大值。一般我们设定该值为：\n",
    " * 64\n",
    " * 128\n",
    " * 256\n",
    " * ...\n",
    " \n",
    " \n",
    "* 设定 `keep_probability` 为在 dropout 过程中保留一个节点的概率。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 143,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# TODO: Tune Parameters\n",
    "# 15代基本能稳定在55%\n",
    "epochs = 15\n",
    "\n",
    "# batch_size越大，每个epoch调用train_neural_network的频率就越低（稍微快些），但是会导致早几代的准确率下降(收敛速度下降)\n",
    "# 1080ti似乎可以支持到1024\n",
    "# 注意batch_size过大导致OOM之后，需要重新运行checkpoint后的所有代码才可以，否则会持续OOM。\n",
    "batch_size = 512\n",
    "\n",
    "# 减弱过拟合\n",
    "keep_probability = 0.5\n",
    "\n",
    "global_stddev = 0.1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 对单批 CIFAR-10 数据进行训练\n",
    "\n",
    "相比于在所有 CIFAR-10 数据上训练神经网络，我们首先使用一批数据进行训练。这会帮助你在调节模型提高精度的过程中节省时间。当最终的验证精度超过 50% 之后，你就可以前往下一节在所有数据上运行该模型了。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Checking the Training on a Single Batch...\n",
      "Epoch  1, CIFAR-10 Batch 1:  loss = 2.01225    accuracy = 36.4 %\n",
      "Epoch  2, CIFAR-10 Batch 1:  loss = 1.8636    accuracy = 42.14 %\n",
      "Epoch  3, CIFAR-10 Batch 1:  loss = 1.73107    accuracy = 45.02 %\n",
      "Epoch  4, CIFAR-10 Batch 1:  loss = 1.71657    accuracy = 45.78 %\n",
      "Epoch  5, CIFAR-10 Batch 1:  loss = 1.63374    accuracy = 48.2 %\n",
      "Epoch  6, CIFAR-10 Batch 1:  loss = 1.46242    accuracy = 49.16 %\n",
      "Epoch  7, CIFAR-10 Batch 1:  loss = 1.40084    accuracy = 48.76 %\n",
      "Epoch  8, CIFAR-10 Batch 1:  loss = 1.35205    accuracy = 50.6 %\n",
      "Epoch  9, CIFAR-10 Batch 1:  loss = 1.31065    accuracy = 48.5 %\n",
      "Epoch 10, CIFAR-10 Batch 1:  loss = 1.14954    accuracy = 51.08 %\n",
      "Epoch 11, CIFAR-10 Batch 1:  loss = 1.13003    accuracy = 49.52 %\n",
      "Epoch 12, CIFAR-10 Batch 1:  loss = 1.07696    accuracy = 50.78 %\n",
      "Epoch 13, CIFAR-10 Batch 1:  loss = 1.04031    accuracy = 51.9 %\n",
      "Epoch 14, CIFAR-10 Batch 1:  loss = 0.996598    accuracy = 52.14 %\n",
      "Epoch 15, CIFAR-10 Batch 1:  loss = 0.956844    accuracy = 51.9 %\n",
      "Time Spent: 13.73\n"
     ]
    }
   ],
   "source": [
    "\"\"\"\n",
    "DON'T MODIFY ANYTHING IN THIS CELL\n",
    "\"\"\"\n",
    "from time import time\n",
    "print('Checking the Training on a Single Batch...')\n",
    "\n",
    "with tf.Session() as sess:\n",
    "    # Initializing the variables\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "    \n",
    "    # 对五万张照片中的第一批（10000张）照片进行训练，每次选择9000张作为训练集。\n",
    "    start = time()\n",
    "    for epoch in range(epochs):\n",
    "        batch_i = 1\n",
    "        for batch_features, batch_labels in helper.load_preprocess_training_batch(batch_i, batch_size):\n",
    "            train_neural_network(sess, optimizer, keep_probability, batch_features, batch_labels)\n",
    "        print('Epoch {:>2}, CIFAR-10 Batch {}:  '.format(epoch + 1, batch_i), end='')\n",
    "        print_stats(sess, batch_features, batch_labels, cost, accuracy)\n",
    "    end = round(time() - start, 2)\n",
    "    print(\"Time Spent:\", end)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 参数与模型性能的关系探索"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### epoch \n",
    "\n",
    "- 代数越多，模型的准确度会趋近于越好，并收敛于一个值左右，上下震动。\n",
    "\n",
    "\n",
    "- 当准确度不再随epoch增长而增长时，模型就算收敛了。再往下训练有可能发展为过拟合。\n",
    "\n",
    "| epoch | batch_size | prob | stddev | accuracy |\n",
    "| ----- | ---------- | ---- | ------ | -------- |\n",
    "| **#1**  | 512        | 0.5  | 0.01 | **26%**  |\n",
    "| **#2**  | 512        | 0.5  | 0.01 | **33%**  |\n",
    "| **#3**  | 512        | 0.5  | 0.01 | **39%**  |\n",
    "| **#4**  | 512        | 0.5  | 0.01 | **42%**  |\n",
    "| **#5**  | 512        | 0.5  | 0.01 | **45%**  |\n",
    "| **#10** | 512        | 0.5  | 0.01 | **52%**  |\n",
    "| **#15** | 512        | 0.5  | 0.01 | **54%**  |\n",
    "| **#20** | 512        | 0.5  | 0.01 | **54%**  |\n",
    "| **#25** | 512        | 0.5  | 0.01 | **56%**  |\n",
    "| **#30** | 512        | 0.5  | 0.01 | **57%**  |\n",
    "| **#35** | 512        | 0.5  | 0.01 | **56%**  |\n",
    "| **#40** | 512        | 0.5  | 0.01 | **57%**  |\n",
    "\n",
    "以上结果基于模型参数:\n",
    "- 卷积层：输出个数 128, 滤波器尺寸 [3, 3], 滤波器步长 [1, 1], 池化尺寸 [2, 2], 池化步长 [1, 1]\n",
    "- 全链接层：输出个数 512"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### `batch_size` \n",
    "\n",
    "- 结论：`batch_size` 会影响训练时间，但不会影响准确率\n",
    "\n",
    "| time (sec) | epoch | batch_size | prob | stddev | accuracy |\n",
    "| ---------- | ----- | ---------- | ---- | ------ | -------- |\n",
    "| **80**     | 35    | **1024**   | 0.5  | 0.01   | 55% (start at 20%) |\n",
    "| **83**     | 35    | **512**    | 0.5  | 0.01   | 55% (start at 25%) |\n",
    "| **93**     | 35    | **256**    | 0.5  | 0.01   | 55% (start at 26%) |\n",
    "| **116**    | 35    | **128**    | 0.5  | 0.01   | 55% (start at 32%) |\n",
    "| **161**    | 35    | **64**     | 0.5  | 0.01   | 55% (start at 39%) |\n",
    "\n",
    "以上结果基于模型参数:\n",
    "- 卷积层：输出个数 128, 滤波器尺寸 [3, 3], 滤波器步长 [1, 1], 池化尺寸 [2, 2], 池化步长 [1, 1]\n",
    "- 全链接层：输出个数 512"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### `stddev` \n",
    "\n",
    "- `stddev` 过小会导致收敛过慢。达到相同准确率需要更多轮训练时间。\n",
    "\n",
    "| time (sec) | epoch | batch_size | prob | stddev | accuracy |\n",
    "| ---------- | ----- | ---------- | ---- | ------ | -------- |\n",
    "| **34**     | **15**    | 1024       | 0.5  | **0.01**   | 55%      |\n",
    "| **80**     | **35**    | 1024       | 0.5  | **0.001**  | 55%      |\n",
    "\n",
    "\n",
    "- `stddev` 过大会导致欠拟合\n",
    "\n",
    "| time (sec) | epoch | batch_size | prob | stddev | accuracy |\n",
    "| ---------- | ----- | ---------- | ---- | ------ | -------- |\n",
    "| 80         | 35    | 1024       | 0.5  | **0.01**   | **55%**      |\n",
    "| 80         | 35    | 1024       | 0.5  |  **0.1**   | **55%**      |\n",
    "| 80         | 35    | 1024       | 0.5  |    **1**   | **11%**      |\n",
    "\n",
    "以上结果基于模型参数:\n",
    "- 卷积层：输出个数 128, 滤波器尺寸 [3, 3], 滤波器步长 [1, 1], 池化尺寸 [2, 2], 池化步长 [1, 1]\n",
    "- 全链接层：输出个数 512"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### keep_probability\n",
    "\n",
    "- 调小每个节点的保留概率可以缓解过拟合的情况\n",
    "\n",
    "\n",
    "- 但如果保留概率过小，则会出现欠拟合。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.figure.Figure at 0x2810001fd30>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\nhyMiIiIiItK+GzV352ev55MaZ/z8iqFU3zJOREREREQkWO161kczY9F1P+K99z8ksUvnoMMRERER\nEWkxGRkZtOZlT3Ji2vUZNYC07l3o1bXdvw0iIiIiIhJD1KGIiIiIiIjEGDVqIiIiItLmVVVVBR2C\ntBPNNbxUjZqIiIiItGkJCQns3LmTiooKXaMlLcrd+eqrr+jS5cTvy9yuJxMRERERkbavT58+7Nu3\nj+3bt1NZWRl0OJSXlzfLB3kJRkP569KlS7Pcp06NmoiIiIi0aR06dCA1NZXU1NSgQwGqb1g+YsSI\noMOQ49Ra+dPQRxERERERkRijRk1ERERERCTGqFETERERERGJMWrUREREREREYowaNRERERERkRhj\nrXkvCTPbC2xvtRdsvBRgX9BByHFT/sJN+Qs35S/clL/wUu7CTfkLtxPNXz93P62hnVq1UYtVZpbn\n7qODjkOOj/IXbspfuCl/4ab8hZdyF27KX7i1Vv409FFERERERCTGqFETERERERGJMWrUqv1X0AHI\nCVH+wk35CzflL9yUv/BS7sJN+Qu3VsmfrlETERERERGJMTqjJiIiIiIiEmPadaNmZpea2adm9rmZ\n3R10PNJ0ZlZoZpvM7BMzyws6HonOzBaaWbGZ/anWulPMbKWZfRb5nhxkjFK3enL3oJntjNTfJ2Y2\nKcgYpX5mlm5mq8ws38w2m9ltkfWqvxCIkj/VYAiYWRcz+72ZbYzk72eR9aq/EIiSvxavv3Y79NHM\nOgJbgQnADuAPwE/cPT/QwKRJzKwQGO3uuhdJCJjZeUAZkOPuQyLrfg587e6PRv5gkuzus4KMU45V\nT+4eBMrc/fEgY5OGmVlPoKe7bzCzRGA98GPgOlR/MS9K/q5CNRjzzMyABHcvM7POwO+A24CpqP5i\nXpT8XUoL1197PqN2FvC5uxe4ewXwIjA54JhE2jR3XwN8/b3Vk4HnI8vPU/3hQ2JMPbmTkHD3Xe6+\nIbJcCmwBeqP6C4Uo+ZMQ8GplkYedI1+O6i8UouSvxbXnRq03UFTr8Q70j14YOfA/ZrbezG4MOhg5\nLj3cfVdkeTfQI8hgpMluNbM/RoZGathOCJhZBjACWIfqL3S+lz9QDYaCmXU0s0+AYmClu6v+QqSe\n/EEL1197btSkbchy9+HARODmyPAsCSmvHovdPsdjh9NTQH9gOLAL+EWw4UhDzKwr8Apwu7uX1N6m\n+ot9deRPNRgS7n448nmlD3CWmQ353nbVXwyrJ38tXn/tuVHbCaTXetwnsk5CxN13Rr4XA69SPaRV\nwmVP5PqLI9dhFAccjzSSu++J/OdVBSxA9RfTItdWvAIsdfdlkdWqv5CoK3+qwfBx9/3AKqqvb1L9\nhUzt/LVG/bXnRu0PwEAzyzSzk4C/B5YHHJM0gZklRC6qxswSgIuBP0V/lsSg5cC1keVrgd8GGIs0\nwZEPGBFTUP3FrMjF8M8CW9z9l7U2qf5CoL78qQbDwcxOM7OkyHIc1RPZ/RnVXyjUl7/WqL92O+sj\nQGQazblAR2Chu/97wCFJE5hZf6rPogF0Al5QDmObmf0KGA+kAHuAB4DXgJeAvsB24Cp316QVMaae\n3I2nesiHA4XATbWut5AYYmZZwPvAJqAqsvpeqq9zUv3FuCj5+wmqwZhnZkOpniykI9UnSV5y94fM\n7FRUfzEvSv4W08L1164bNRERERERkVjUnoc+ioiIiIiIxCQ1aiIiIiIiIjFGjZqIiIiIiEiMUaMm\nIiIiIiISY9SoiYiIiIiIxBg1aiIiIiIiIjFGjZqIiIiIiEiMUaMmIiIiIiISY/4f2ZKAoxGItHAA\nAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x2816f474fd0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "idx = np.arange(35)\n",
    "res_005 = [18.32,23.0,30.46,33.52,36.76,38.04,38.4,40.86,41.66,42.68,42.38,42.96,45.14,45.84,46.04,46.28,46.26,47.1,46.68,47.82,47.36,48.0,48.78,48.92,49.64,49.52,49.36,49.62,49.18,50.14,49.68,50.54,49.18,50.62,50.44]\n",
    "res_01 = [26.12, 31.72, 38.5, 40.84, 43.36, 44.96, 46.36, 48.0, 49.64, 50.48, 50.82, 51.36, 52.54, 53.12, 53.3, 53.18, 53.28, 53.08, 53.78, 55.54, 55.64, 55.66, 55.6, 55.78, 56.06, 57.46, 56.9, 57.6, 57.76, 58.12, 58.14, 57.86, 57.86, 58.28, 58.16]\n",
    "res_05 = [26.48,36.14,39.66,45.08,47.34,50.4,51.56,52.72,52.72,53.36,53.12,54.5,55.52,55.24,54.9,55.62,55.1,53.38,54.58,55.44,54.68,52.76,55.62,55.98,56.82,57.2,57.3,57.1,56.9,57.0,56.62,57.12,55.66,56.14,56.18]\n",
    "res_09 = [25.56,37.88,41.14,45.5,48.78,50.4,49.4,51.22,52.66,54.5,53.18,55.18,55.46,56.14,56.06,54.28,54.22,53.02,53.36,52.42,51.0,53.54,52.76,54.98,54.86,55.16,55.2,54.94,53.62,50.8,53.0,52.04,54.16,52.24,52.74]\n",
    "res_10 = [25.16,32.88,37.6,40.82,43.56,46.88,50.94,51.68,52.52,50.76,52.96,53.68,54.2,53.9,53.76,53.8,55.12,55.0,56.14,55.34,53.96,52.2,55.28,53.36,53.48,50.56,51.98,52.62,52.72,54.2,53.64,53.12,52.66,55.04,55.36]\n",
    "plt.figure(figsize=(15,5))\n",
    "plt.plot(idx, res_005, label='keep rate = 0.05')\n",
    "plt.plot(idx, res_01, label='keep rate = 0.1')\n",
    "plt.plot(idx, res_05, label='keep rate = 0.5')\n",
    "plt.plot(idx, res_09, label='keep rate = 0.9')\n",
    "plt.plot(idx, res_10, label='keep rate = 1.0')   # No dropout\n",
    "plt.title(\"Accuracy under different dropout rate\")\n",
    "plt.legend(fontsize=13)\n",
    "plt.grid(True)\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 完全训练该模型\n",
    "\n",
    "因为你在单批 CIFAR-10 数据上已经得到了一个不错的准确率了，那你可以尝试在所有五批数据上进行训练。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 139,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training...\n",
      "Epoch  1, CIFAR-10 Batch 1:  loss = 2.09307    accuracy = 28.66 %\n",
      "Epoch  1, CIFAR-10 Batch 2:  loss = 1.7693    accuracy = 35.7 %\n",
      "Epoch  1, CIFAR-10 Batch 3:  loss = 1.59276    accuracy = 39.3 %\n",
      "Epoch  1, CIFAR-10 Batch 4:  loss = 1.52608    accuracy = 42.88 %\n",
      "Epoch  1, CIFAR-10 Batch 5:  loss = 1.57057    accuracy = 45.24 %\n",
      "Epoch  2, CIFAR-10 Batch 1:  loss = 1.57112    accuracy = 45.5 %\n",
      "Epoch  2, CIFAR-10 Batch 2:  loss = 1.38283    accuracy = 48.64 %\n",
      "Epoch  2, CIFAR-10 Batch 3:  loss = 1.23539    accuracy = 49.14 %\n",
      "Epoch  2, CIFAR-10 Batch 4:  loss = 1.28118    accuracy = 49.94 %\n",
      "Epoch  2, CIFAR-10 Batch 5:  loss = 1.25992    accuracy = 52.32 %\n",
      "Epoch  3, CIFAR-10 Batch 1:  loss = 1.31034    accuracy = 52.9 %\n",
      "Epoch  3, CIFAR-10 Batch 2:  loss = 1.18839    accuracy = 54.54 %\n",
      "Epoch  3, CIFAR-10 Batch 3:  loss = 1.04468    accuracy = 54.14 %\n",
      "Epoch  3, CIFAR-10 Batch 4:  loss = 1.07237    accuracy = 56.6 %\n",
      "Epoch  3, CIFAR-10 Batch 5:  loss = 1.04407    accuracy = 56.72 %\n",
      "Epoch  4, CIFAR-10 Batch 1:  loss = 1.09756    accuracy = 57.1 %\n",
      "Epoch  4, CIFAR-10 Batch 2:  loss = 1.01959    accuracy = 58.26 %\n",
      "Epoch  4, CIFAR-10 Batch 3:  loss = 0.908608    accuracy = 57.58 %\n",
      "Epoch  4, CIFAR-10 Batch 4:  loss = 0.913614    accuracy = 60.42 %\n",
      "Epoch  4, CIFAR-10 Batch 5:  loss = 0.870336    accuracy = 59.74 %\n",
      "Epoch  5, CIFAR-10 Batch 1:  loss = 0.938603    accuracy = 59.14 %\n",
      "Epoch  5, CIFAR-10 Batch 2:  loss = 0.894872    accuracy = 61.36 %\n",
      "Epoch  5, CIFAR-10 Batch 3:  loss = 0.755662    accuracy = 60.7 %\n",
      "Epoch  5, CIFAR-10 Batch 4:  loss = 0.783073    accuracy = 62.12 %\n",
      "Epoch  5, CIFAR-10 Batch 5:  loss = 0.736353    accuracy = 62.36 %\n",
      "Epoch  6, CIFAR-10 Batch 1:  loss = 0.839645    accuracy = 60.3 %\n",
      "Epoch  6, CIFAR-10 Batch 2:  loss = 0.764476    accuracy = 63.22 %\n",
      "Epoch  6, CIFAR-10 Batch 3:  loss = 0.657835    accuracy = 62.7 %\n",
      "Epoch  6, CIFAR-10 Batch 4:  loss = 0.673994    accuracy = 63.9 %\n",
      "Epoch  6, CIFAR-10 Batch 5:  loss = 0.62813    accuracy = 62.76 %\n",
      "Epoch  7, CIFAR-10 Batch 1:  loss = 0.672632    accuracy = 63.64 %\n",
      "Epoch  7, CIFAR-10 Batch 2:  loss = 0.679402    accuracy = 64.08 %\n",
      "Epoch  7, CIFAR-10 Batch 3:  loss = 0.545741    accuracy = 63.9 %\n",
      "Epoch  7, CIFAR-10 Batch 4:  loss = 0.577627    accuracy = 63.96 %\n",
      "Epoch  7, CIFAR-10 Batch 5:  loss = 0.537175    accuracy = 62.84 %\n",
      "Epoch  8, CIFAR-10 Batch 1:  loss = 0.573941    accuracy = 64.3 %\n",
      "Epoch  8, CIFAR-10 Batch 2:  loss = 0.611532    accuracy = 64.16 %\n",
      "Epoch  8, CIFAR-10 Batch 3:  loss = 0.450235    accuracy = 64.56 %\n",
      "Epoch  8, CIFAR-10 Batch 4:  loss = 0.48255    accuracy = 64.78 %\n",
      "Epoch  8, CIFAR-10 Batch 5:  loss = 0.43611    accuracy = 65.14 %\n",
      "Epoch  9, CIFAR-10 Batch 1:  loss = 0.497509    accuracy = 65.18 %\n",
      "Epoch  9, CIFAR-10 Batch 2:  loss = 0.517562    accuracy = 66.3 %\n",
      "Epoch  9, CIFAR-10 Batch 3:  loss = 0.424025    accuracy = 63.72 %\n",
      "Epoch  9, CIFAR-10 Batch 4:  loss = 0.440471    accuracy = 65.1 %\n",
      "Epoch  9, CIFAR-10 Batch 5:  loss = 0.347626    accuracy = 66.1 %\n",
      "Epoch 10, CIFAR-10 Batch 1:  loss = 0.418946    accuracy = 65.32 %\n",
      "Epoch 10, CIFAR-10 Batch 2:  loss = 0.455364    accuracy = 66.14 %\n",
      "Epoch 10, CIFAR-10 Batch 3:  loss = 0.323968    accuracy = 66.48 %\n",
      "Epoch 10, CIFAR-10 Batch 4:  loss = 0.391614    accuracy = 64.9 %\n",
      "Epoch 10, CIFAR-10 Batch 5:  loss = 0.312599    accuracy = 65.86 %\n",
      "Epoch 11, CIFAR-10 Batch 1:  loss = 0.329802    accuracy = 65.7 %\n",
      "Epoch 11, CIFAR-10 Batch 2:  loss = 0.400377    accuracy = 64.26 %\n",
      "Epoch 11, CIFAR-10 Batch 3:  loss = 0.302707    accuracy = 65.78 %\n",
      "Epoch 11, CIFAR-10 Batch 4:  loss = 0.318054    accuracy = 65.92 %\n",
      "Epoch 11, CIFAR-10 Batch 5:  loss = 0.285328    accuracy = 64.58 %\n",
      "Epoch 12, CIFAR-10 Batch 1:  loss = 0.288765    accuracy = 63.88 %\n",
      "Epoch 12, CIFAR-10 Batch 2:  loss = 0.364699    accuracy = 63.2 %\n",
      "Epoch 12, CIFAR-10 Batch 3:  loss = 0.241804    accuracy = 65.52 %\n",
      "Epoch 12, CIFAR-10 Batch 4:  loss = 0.25681    accuracy = 65.7 %\n",
      "Epoch 12, CIFAR-10 Batch 5:  loss = 0.234722    accuracy = 65.02 %\n",
      "Epoch 13, CIFAR-10 Batch 1:  loss = 0.227661    accuracy = 66.7 %\n",
      "Epoch 13, CIFAR-10 Batch 2:  loss = 0.248815    accuracy = 66.84 %\n",
      "Epoch 13, CIFAR-10 Batch 3:  loss = 0.186888    accuracy = 65.84 %\n",
      "Epoch 13, CIFAR-10 Batch 4:  loss = 0.244733    accuracy = 62.76 %\n",
      "Epoch 13, CIFAR-10 Batch 5:  loss = 0.19178    accuracy = 66.8 %\n",
      "Epoch 14, CIFAR-10 Batch 1:  loss = 0.186484    accuracy = 67.78 %\n",
      "Epoch 14, CIFAR-10 Batch 2:  loss = 0.207454    accuracy = 67.06 %\n",
      "Epoch 14, CIFAR-10 Batch 3:  loss = 0.168    accuracy = 67.12 %\n",
      "Epoch 14, CIFAR-10 Batch 4:  loss = 0.193025    accuracy = 64.54 %\n",
      "Epoch 14, CIFAR-10 Batch 5:  loss = 0.166023    accuracy = 68.16 %\n",
      "Epoch 15, CIFAR-10 Batch 1:  loss = 0.158841    accuracy = 66.8 %\n",
      "Epoch 15, CIFAR-10 Batch 2:  loss = 0.168162    accuracy = 66.34 %\n",
      "Epoch 15, CIFAR-10 Batch 3:  loss = 0.141671    accuracy = 67.26 %\n",
      "Epoch 15, CIFAR-10 Batch 4:  loss = 0.14164    accuracy = 66.42 %\n",
      "Epoch 15, CIFAR-10 Batch 5:  loss = 0.123076    accuracy = 68.32 %\n",
      "Time Spent: 65.21\n"
     ]
    }
   ],
   "source": [
    "\"\"\"\n",
    "DON'T MODIFY ANYTHING IN THIS CELL\n",
    "\"\"\"\n",
    "save_model_path = './image_classification'\n",
    "\n",
    "print('Training...')\n",
    "with tf.Session() as sess:\n",
    "    # Initializing the variables\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "    start = time()\n",
    "    # Training cycle\n",
    "    for epoch in range(epochs):\n",
    "        # Loop over all batches\n",
    "        n_batches = 5\n",
    "        for batch_i in range(1, n_batches + 1):\n",
    "            for batch_features, batch_labels in helper.load_preprocess_training_batch(batch_i, batch_size):\n",
    "                train_neural_network(sess, optimizer, keep_probability, batch_features, batch_labels)\n",
    "            print('Epoch {:>2}, CIFAR-10 Batch {}:  '.format(epoch + 1, batch_i), end='')\n",
    "            print_stats(sess, batch_features, batch_labels, cost, accuracy)\n",
    "    end = round(time() - start, 2)\n",
    "    print(\"Time Spent:\", end)        \n",
    "    # Save Model\n",
    "    saver = tf.train.Saver()\n",
    "    save_path = saver.save(sess, save_model_path)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 卷积层输出个数\n",
    "\n",
    "- conv_num_ouput 越大，训练耗时越大，但准确率没有明显变化。\n",
    "\n",
    "| time (sec) | 卷积层输出 | 卷积层尺寸 | 卷积层步长 | 池化层尺寸 | 池化层步长 | 全链接层输出 | 准确率    |\n",
    "| ---------- | -------- | --------- | -------- | -------- | -------- | ----------- | -------- |\n",
    "| **54**     | **8**    | [3,3]     |    1     |   [2,2]  | 1        |    128     |     **61%**   |\n",
    "| **58**     | **16**   | [3,3]     |    1     |   [2,2]  | 1        |    128     |     **62%**   |\n",
    "| **67**     | **32**   | [3,3]     |    1     |   [2,2]  | 1        |    128     |     **62%**   |\n",
    "| **91**     | **64**   | [3,3]     |    1     |   [2,2]  | 1        |    128     |     **62%**   |\n",
    "| **131**    | **128**  | [3,3]     |    1     |   [2,2]  | 1        |    128     |     **61%**   |\n",
    "\n",
    "- 以上结果基于以下参数:\n",
    "    - 训练代数 epoch 15\n",
    "    - batch_size = 64\n",
    "    - keep_prob = 0.5\n",
    "    - stddev = 0.01"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 全链接层输出个数\n",
    "\n",
    "- full_num_ouput 越大，准确率有稳定的明显提升\n",
    "\n",
    "| time (sec) | 卷积层输出 | 卷积层尺寸 | 卷积层步长 | 池化层尺寸 | 池化层步长 | 全链接层输出 | 准确率 | 达到60%准确率的代数 |\n",
    "| ---------- | -------- | --------- | -------- | -------- | -------- | ----------- | -------- | --------------|\n",
    "| **66**     | 16       | [3,3]     |    1     |   [2,2]  | 1        |  **64**    |   **59%** | N/A\n",
    "| **56**     | 16       | [3,3]     |    1     |   [2,2]  | 1        |  **128**   |   **62%** | #8\n",
    "| **60**     | 16       | [3,3]     |    1     |   [2,2]  | 1        |  **256**   |   **63%** | #5\n",
    "| **66**     | 16       | [3,3]     |    1     |   [2,2]  | 1        |  **512**   |   **64%** | #3\n",
    "| **82**     | 16       | [3,3]     |    1     |   [2,2]  | 1        |  **1024**  |   **65%** | #3\n",
    "\n",
    "- 以上结果基于以下参数:\n",
    "    - 训练代数 epoch 15\n",
    "    - batch_size = 64\n",
    "    - keep_prob = 0.5\n",
    "    - stddev = 0.01"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 卷积层串联个数\n",
    "\n",
    "- 将卷积层多层级联可以提升准确率。\n",
    "\n",
    "| time (sec) | 卷积层输出 | 卷积层尺寸 | 卷积层步长 | 池化层尺寸 | 池化层步长 | 全链接层输出 | 准确率 |\n",
    "| ---------- | -------- | --------- | -------- | -------- | -------- | ----------- | -------- |\n",
    "| **66**  | **16**       | [3,3]     |    1     |   [2,2]  | 1        |  1024    |   **65%** |\n",
    "| **120** | **16,16**    | [3,3]     |    1     |   [2,2]  | 1        |  1024    |   **66%** |\n",
    "| **212** | **16,16,16** | [3,3]     |    1     |   [2,2]  | 1        |  1024    |   **67%** |\n",
    "| **260** | **16,16,16,16,16** | [3,3]     |    1     |   [2,2]  | 1  |  1024    |   **64%** |"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 全链接层串联个数\n",
    "\n",
    "尝试了增加全链接层的级联个数，但是没有明显的准确率提升。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 卷积滤波器尺寸\n",
    "\n",
    "测试微调滤波器的尺寸 [2 x 2], [3 x 3], [4 x 4], [8 x 8]，结果显示 [3 x 3] 最好。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 再次讨论batch_size的影响\n",
    "\n",
    "- 在后期调整模型参数的时候，一开始使用的batch_size都是64，从训练上看，收敛速度相当快，甚至能够达到第2代训练就能上60%，不过相对的完整15代训练时间要200多秒才能完成三层卷积层的模型。\n",
    "\n",
    "\n",
    "- 后来想起来batch_size能够影响速度，就将batch_size升至512，训练速度可以减少到65秒，很爽，不过同时也发现收敛速度变慢，需要到第5代才能爬升到60%的准确率。\n",
    "\n",
    "\n",
    "综上所述，观察到batch_size会影响收敛速率和训练速度。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 检查点\n",
    "\n",
    "该模型已经被存储到你的硬盘中。\n",
    "\n",
    "## 测试模型\n",
    "\n",
    "这部分将在测试数据集上测试你的模型。这边得到的准确率将作为你的最终准确率。你应该得到一个高于 50% 准确率。如果它没有超过 50%，那么你需要继续调整模型架构及参数。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 142,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(10000, 32, 32, 3)\n",
      "INFO:tensorflow:Restoring parameters from ./image_classification\n",
      "Testing Accuracy: 0.6753159463405609\n",
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n4IdkdY4LwG/OoYzb2dwJvBn43bggTuocvxv4FvD28xxfRESWqIZdHIvIkrYXuBf4z4wAAASLSURB\nVB34bLxtAR4DPh1C+Pb5Dh5COGpmr8PrHf8qcD3wLPBhYID5WRz379q1i+3bZyxmISIiZ7Br1y6A\n/sV4bJt5M7eIiJwPM5sAisDPFnsuImSH0jyzqLMQyZztNdkPDIcQLlmY6WQUORYRuTB2wux1kEUW\nUnKSo16PUi/q+TWpDXkiIiIiIpEWxyIiIiIikRbHIiIiIiKRFsciIiIiIpEWxyIiIiIikUq5iYiI\niIhEihyLiIiIiERaHIuIiIiIRFoci4iIiIhEWhyLiIiIiERaHIuIiIiIRFoci4iIiIhEWhyLiIiI\niERaHIuIzIGZbTSzvzKzA2Y2YWYDZna3ma1YjHFE5uO1FO8TZvl46ULOXxqHmf2amX3ezB4ys+H4\n+vkfL3OsRX+P1CEgIiJnYWZbgEeAtcA3gGeAG4BbgWeB14UQji3UOCLz+JocAHqBu2foPhVC+Nx8\nzVkal5k9AVwDnAJeBK4E/iaE8L5zHKcu3iObLvQDiIg0gD/D36x/J4Tw+aTRzP4E+CjwGeD2BRxH\nZD5fS4MhhLvmfYaynHwUXxT/HLgZ+N7LHKcu3iMVORYROYMYyfg5MABsCSHUcn1dwEHAgLUhhJEL\nPY7IfL6WYuSYEEL/BZquLDNmdgu+OD6nyHE9vUcq51hE5Mxujbf359+sAUIIJ4EfAu3AaxdoHJH5\nfi21mNn7zOxOM/uImd1qZsV5nK/IXNTNe6QWxyIiZ3ZFvH1ulv7d8fbyBRpHZL5fS+uBe/E/Wd8N\nPADsNrObX/YMRc5d3bxHanEsInJmPfF2aJb+pL13gcYRmc/X0n8D3owvkDuAVwF/DvQD95nZNS9/\nmiLnpG7eI7UhT0REZJkKIXxqStNO4HYzOwV8HLgLeOdCz0tkMSlyLCJyZkm0omeW/qR9cIHGEVmI\n19I98faN5zGGyLmom/dILY5FRM7s2Xg7W57bZfF2tjy5+R5HZCFeS0fibcd5jCFyLurmPVKLYxGR\nM0vqdb7VzE57z4zlhV4HjAKPLtA4IgvxWkoqAjx/HmOInIu6eY/U4lhE5AxCCHuA+/ENSv96Sven\n8MjavUndTTMrmdmVsWbnyx5HZDbz9Zo0s21mNi0ybGb9wBfily/rCGCR2SyF90gdAiIichYzHGm6\nC7gRr8v5HHBTcqRpXFjsBfZNPVjhXMYROZP5eE2a2V34prsfAPuAk8AW4DagFfgW8M4QQnkBnpIs\nYWb2DuAd8cv1wC/jf3V4KLYdDSH8Xry2nzp/j9TiWERkDszsYuDTwNuAVfhpTV8HPhVCOJG7rp9Z\n3vjPZRyRsznf12SsY3w7cC1ZKbdB4Am87vG9QYsEmYP4i9Z/OMMl6WtvKbxHanEsIiIiIhIp51hE\nREREJNLiWEREREQk0uJYRERERCTS4lhEREREJNLiWEREREQk0uJYRERERCTS4lhEREREJNLiWERE\nREQk0uJYRERERCTS4lhEREREJNLiWEREREQk0uJYRERERCTS4lhEREREJNLiWEREREQk0uJYRERE\nRCTS4lhEREREJNLiWEREREQk+v9U4vrdWvwIIQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1c2c6a17dd8>"
      ]
     },
     "metadata": {
      "image/png": {
       "height": 319,
       "width": 355
      }
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "\"\"\"\n",
    "DON'T MODIFY ANYTHING IN THIS CELL\n",
    "\"\"\"\n",
    "%matplotlib inline\n",
    "%config InlineBackend.figure_format = 'retina'\n",
    "\n",
    "import tensorflow as tf\n",
    "import pickle\n",
    "import helper\n",
    "import random\n",
    "\n",
    "# Set batch size if not already set\n",
    "try:\n",
    "    if batch_size:\n",
    "        pass\n",
    "except NameError:\n",
    "    batch_size = 64\n",
    "\n",
    "save_model_path = './image_classification'\n",
    "n_samples = 4\n",
    "top_n_predictions = 3\n",
    "\n",
    "def test_model():\n",
    "    \"\"\"\n",
    "    Test the saved model against the test dataset\n",
    "    \"\"\"\n",
    "\n",
    "    # 拿到相应的验证集专用数据\n",
    "    test_features, test_labels = pickle.load(open('preprocess_training.p', mode='rb'))\n",
    "    print(test_features.shape)\n",
    "    loaded_graph = tf.Graph()\n",
    "\n",
    "    with tf.Session(graph=loaded_graph) as sess:\n",
    "        # Load model\n",
    "        loader = tf.train.import_meta_graph(save_model_path + '.meta')\n",
    "        loader.restore(sess, save_model_path)\n",
    "\n",
    "        # Get Tensors from loaded model\n",
    "        loaded_x = loaded_graph.get_tensor_by_name('x:0')\n",
    "        loaded_y = loaded_graph.get_tensor_by_name('y:0')\n",
    "        loaded_keep_prob = loaded_graph.get_tensor_by_name('keep_prob:0')\n",
    "        loaded_logits = loaded_graph.get_tensor_by_name('logits:0')\n",
    "        loaded_acc = loaded_graph.get_tensor_by_name('accuracy:0')\n",
    "        \n",
    "        # Get accuracy in batches for memory limitations\n",
    "        test_batch_acc_total = 0\n",
    "        test_batch_count = 0\n",
    "        \n",
    "        for train_feature_batch, train_label_batch in helper.batch_features_labels(test_features, test_labels, batch_size):\n",
    "            test_batch_acc_total += sess.run(\n",
    "                loaded_acc,\n",
    "                feed_dict={loaded_x: train_feature_batch, loaded_y: train_label_batch, loaded_keep_prob: 1.0})\n",
    "            test_batch_count += 1\n",
    "\n",
    "        print('Testing Accuracy: {}\\n'.format(test_batch_acc_total/test_batch_count))\n",
    "\n",
    "        # Print Random Samples\n",
    "        random_test_features, random_test_labels = tuple(zip(*random.sample(list(zip(test_features, test_labels)), n_samples)))\n",
    "        random_test_predictions = sess.run(\n",
    "            tf.nn.top_k(tf.nn.softmax(loaded_logits), top_n_predictions),\n",
    "            feed_dict={loaded_x: random_test_features, loaded_y: random_test_labels, loaded_keep_prob: 1.0})\n",
    "        helper.display_image_predictions(random_test_features, random_test_labels, random_test_predictions)\n",
    "\n",
    "\n",
    "test_model()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 测试结果\n",
    "\n",
    "> Testing Accuracy: 0.6753159463405609\n",
    "\n",
    "可以看到，经过对每个可调参数的fine tune，最终使用以下参数搭配达到了**67%**的准确度。准备尝试一些新的方法，进一步提升准确度。\n",
    "\n",
    "- epoch = 15\n",
    "- batch_size = 64\n",
    "- keep_prob = 0.5\n",
    "- stddev = 0.01\n",
    "- 卷积层输出结构：16, 16, 16 (三层级联)\n",
    "- 卷积层激活函数：ReLU\n",
    "- 卷积滤波器尺寸：3 x 3\n",
    "- 卷积滤波器步长：1\n",
    "- 池化滤波器尺寸：2 x 2\n",
    "- 池化滤波器步长：1\n",
    "- 全链接层输出结构：1024 （单层）\n",
    "- 全链接层激活函数：ReLU\n",
    "- Padding：SAME Padding"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 为什么仅有 50%~ 80% 的准确率？\n",
    "\n",
    "你也许会觉得奇怪，为什么你的准确率总是提高不上去。对于简单的 CNN 网络而言，50% 并非是很差的表现。纯粹的猜测只会得到 10% 的准确率（因为一共有 10 类）。这是因为还有许多许多能够应用到你模型的技巧。在你做完了该项目之后，你可以探索探索我们给你推荐的一些方法。\n",
    "\n",
    "\n",
    "## 提交该项目\n",
    "\n",
    "在提交项目前，请确保你在运行了所有的 cell 之后保存了项目。将项目储存为 \"image_classification.ipynb\" 并导出为一个 HTML 文件。你可以再菜单栏中选择 File -> Download as 进行导出。请将 \"helper.py\" 及  \"problem_unittests.py\" 文件也放在你的提交文件中。"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
